package com.ajzhang.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import org.apache.log4j.Logger;

/**
 * 获取或转换时间的工具类
 * 
 * @author Yan
 * 
 */
public class DateUtil {

	private static Logger log = Logger.getLogger(DateUtil.class);
	public final static String DEFAULT_TIMEFORMAT = "yyyy-MM-dd HH:mm:ss";
	public final static String HOUR_MINUTE_FORMAT = "HH:mm";
	public final static String YEAR_MONTH_DATE_FORMAT = "yyyy-MM-dd";

	/**
	 * 获取SimpleDateFormat实例
	 * 
	 * @param format
	 *            时间格式
	 * @return
	 * 
	 */
	public static SimpleDateFormat getSimpleDateFormat(String format) {
		return new SimpleDateFormat(format);
	}

	/**
	 * 获取自定义格式的当前时间
	 * 
	 * @param format
	 *            时间格式
	 * @return
	 */
	public static String now(String format) {
		return toString(new Date(), format);
	}

	/**
	 * 获取普通格式当前时间
	 * 
	 * @return
	 */
	public static String now() {
		return toString(new Date(), DEFAULT_TIMEFORMAT);
	}

	/**
	 * 将Date类型转换为自定义类型的String类型时间
	 * 
	 * @param date
	 *            需要转换的时间
	 * @param format
	 *            时间格式
	 * @return
	 */
	public static String toString(Date date, String format) {
		return getSimpleDateFormat(format).format(date);
	}

	/**
	 * 将Date类型转换为普通格式的String类型时间
	 * 
	 * @param date
	 *            需要转换的时间
	 * @return
	 */
	public static String toString(Date date) {
		return toString(date, DEFAULT_TIMEFORMAT);
	}

	/**
	 * 将String类型转换为Date类型
	 * 
	 * @param date
	 *            需要转换的时间
	 * @param format
	 *            时间格式
	 * @return
	 */
	public static Date toDate(String date, String format) {
		try {
			return getSimpleDateFormat(format).parse(date);
		} catch (ParseException e) {
			System.out.println("未能转换时间：" + date + "到格式：" + format + "\n" + e);
		}
		return null;
	}

	/**
	 * 将String类型转换为Date类型
	 * 
	 * @param date
	 *            需要转换的时间
	 * @return
	 */
	public static Date toDate(String date) {
		return toDate(date, DEFAULT_TIMEFORMAT);
	}

	/**
	 * Date 类型的字符串转换为 Date类型
	 * 
	 * @param date
	 *            Date 类型的字符串
	 * @return
	 */
	public static Date toDateByLocaleUS(String date) {
		if (date == null || "".equals(date)) {
			return null;
		}
		SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy", Locale.US);
		try {
			return sdf.parse(date);
		} catch (ParseException e) {
			log.debug("未能转换时间：" + date + "到格式：EEE MMM dd HH:mm:ss Z yyyy\n" + e);
		}
		return null;
	}

	/**
	 * Date 类型的字符串转换为 普通格式的String类型
	 * 
	 * @param date
	 *            Date 类型的字符串
	 * @return
	 */
	public static String toStringByLocaleUS(String date) {
		return toString(toDateByLocaleUS(date));
	}

	/**
	 * 时间戳转化为Date类型的时间
	 * 
	 * @param timestamp
	 *            时间戳
	 * @return
	 */
	public static Date toDate(long timestamp) {
		if (String.valueOf(timestamp).length() == 10) {
			timestamp *= 1000;
		}
		return new Date(timestamp);
	}

	/**
	 * 时间戳转化为String类型的时间
	 * 
	 * @param timestamp
	 *            时间戳
	 * @return
	 */
	public static String toString(long timestamp) {
		return toString(toDate(timestamp));
	}

	/**
	 * 获取一个字符串类型时间的时间戳
	 * 
	 * @param date
	 *            需要转换的时间
	 * @return
	 */
	public static long toTimestamp(String date) {
		return toDate(date).getTime();
	}

	/**
	 * 将一个字符串类型的时间，转换为指定的时间格式之后获取时间戳
	 * 
	 * @param date
	 *            需要转换的时间
	 * @param format
	 *            时间格式
	 * @return
	 */
	public static long toTimestamp(String date, String format) {
		return toDate(date, format).getTime();
	}

	/**
	 * 比较指定的时间单位是否与现在相同
	 * 
	 * @param field
	 *            时间单位(年份、月份、日期、小时、分钟)
	 * @param date
	 *            需要比较的时间
	 * @return
	 */
	public static boolean fieldEqual(int field, String date) {
		return fieldEqual(field, toDate(date, YEAR_MONTH_DATE_FORMAT));
	}

	/**
	 * 比较指定的时间单位是否与现在相同
	 * 
	 * @param field
	 *            时间单位(年份、月份、日期、小时、分钟)
	 * @param date
	 *            需要比较的时间
	 * @return
	 */
	public static boolean fieldEqual(int field, Date date) {
		Calendar calendar = Calendar.getInstance();
		int nowTime = calendar.get(field);
		calendar.setTime(date);
		return nowTime == calendar.get(field);
	}

	/**
	 * 将时间转换为汉字表示的格式
	 * 
	 * @param time
	 *            需要转换的时间
	 * @return
	 */
	public static String formatTime(Date time) {
		if (time == null)
			return null;
		Calendar cNow = Calendar.getInstance();

		Calendar cCom = Calendar.getInstance();
		cCom.setTime(time);
		long timeDiff = cNow.getTimeInMillis() - cCom.getTimeInMillis();
		long dateDiff = cNow.get(Calendar.DATE) - cCom.get(Calendar.DATE);

		if (cNow.get(Calendar.YEAR) != cCom.get(Calendar.YEAR))
			return toString(time, "yyyy年MM月dd日 HH:mm");

		if (timeDiff < 1000 * 60)
			return "刚刚";
		else if (timeDiff < 1000 * 60 * 60)
			return timeDiff / 1000 / 60 + "分钟前";
		else if (timeDiff < 1000 * 60 * 60 * 24 && dateDiff == 0)
			return "今天 " + toString(time, HOUR_MINUTE_FORMAT);
		else if (timeDiff < 1000 * 60 * 60 * 24 * 2 && dateDiff == 1)
			return "昨天 " + toString(time, HOUR_MINUTE_FORMAT);
		else if (timeDiff < 1000 * 60 * 60 * 24 * 2 && dateDiff == 2)
			return "前天 " + toString(time, HOUR_MINUTE_FORMAT);
		else if (cNow.get(Calendar.MONTH) == cCom.get(Calendar.MONTH))
			return cNow.get(Calendar.DAY_OF_MONTH) - cCom.get(Calendar.DAY_OF_MONTH) + "天前" + toString(time, HOUR_MINUTE_FORMAT);
		else
			return toString(time, "MM月dd日 HH:mm");
	}

	/**
	 * 将时间转换为汉字表示的格式
	 * 
	 * @param time
	 *            需要转换的时间
	 * @return
	 */
	public static String formatTime(String time) {
		return formatTime(toDate(time));
	}

	/**
	 * 获取某一周指定的周几的时间 如上一周周三：week = -1,weekDay = 4
	 * 
	 * @param week
	 * @param weekDay
	 * @return
	 * @throws Exception
	 */
	public static Date getOneDayOfWeek(int week, int weekDay) throws Exception {

		Calendar c = Calendar.getInstance();

		c.add(Calendar.WEEK_OF_YEAR, week);

		int preNowWeekDay = c.get(Calendar.DAY_OF_WEEK);

		int preSubDays = weekDay - preNowWeekDay;

		c.add(Calendar.DAY_OF_WEEK, preSubDays);
		

		return c.getTime();

	}
	public static void main(String[] args) {
		Calendar cal = Calendar.getInstance();
		int year = cal.get(Calendar.YEAR);
		System.out.println(year);
	}
}
